﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Starfox
{
    class Enemy : GameObject3D
    {
        public float DirecaoFrontalX { get; set; }
        public float DirecaoFrontalY { get; set; }

        public const float Velocidade = 0.1f;
        public const float VelocidadeCurva = 0.004f;


        //variavel que determina a rotação X da nave
        float rotacaoX;
        //variavel que determina a rotação Z da nave
        float rotacaoZ;

        //variavel que determina a rotação maxima X da nave
        float rotacaoXMax;
        //variavel que determina a rotação  maxima Z da nave
        float rotacaoZMax;

        //variavel que determina a posição da nave
        Vector3 navePos;

        //mira
        Texture2D mira;

        //Vector que determina a posição da mira
        Vector2 posi_mira;

        KeyboardState teclado_atual, teclado_anterior;
        MouseState mouse_atual, mouse_anterior;


        public Enemy(GraphicsDevice graphicsDevice, ContentManager Content, GameWindow Window, BasicCamera camera,Vector3 navePos): base()
        {
            //Carrega o modelo da nave
            this.Model = Content.Load<Model>("SpaceShooter/Space_Shooter");

            //carrega a mira
            mira = Content.Load<Texture2D>("Textures/mira");
           
            DirecaoFrontalX = 0.0f;

            //determina a posição inicial da nave
            this.navePos = navePos;

            //determina a rotação maxima x
            rotacaoXMax = 30;
            //determina a rotação maxima y
            rotacaoZMax = 30;

            //determina a posição inicial da mira
            posi_mira = new Vector2(Window.ClientBounds.Width / 2 - mira.Bounds.Width / 2, Window.ClientBounds.Height / 2 - mira.Bounds.Height / 2 + 100);

        }
        public void Update(GameTime gameTime, GameWindow Window, bool AllRangeMode)
        {
            teclado_atual = Keyboard.GetState();
            teclado_anterior = teclado_atual;
            mouse_atual = Mouse.GetState();
            mouse_anterior = mouse_atual;

            #region movimento
            
            //preciso testar *primeiro* se a posição futura é válida para não travar, por isso a guardo...
            Vector3 posicaoFutura = Posicao;

            //estas duas variáveis temporárias servem para o giro e o movimento
            float quantoVirar = 0;
            float quantoInclinar = 0;
            Vector3 movimento = Vector3.Zero;

            //  aceleração permanente
            movimento.Z += 10;

            //preciso girar meu objeto naquela direção antes de andar
            Matrix matrixOrientacao = Matrix.CreateRotationX(DirecaoFrontalY) * Matrix.CreateRotationY(DirecaoFrontalX);

            //ando com ele aquela quantidade de movimento naquela direcao de orientacao
            Vector3 velocidade = Vector3.Transform(movimento, matrixOrientacao);
            
            //corrijo pela escala da velocidade
            velocidade *= Velocidade;

            //agora sim esta será a nova posicao do objeto
            posicaoFutura = Posicao + velocidade;
            //
            Posicao = posicaoFutura;


            

            #endregion

            Quaternion rodarModelo = Quaternion.CreateFromYawPitchRoll(DirecaoFrontalX, DirecaoFrontalY, 0);
            this.World = Matrix.CreateScale(0.7f) 
                * Matrix.CreateRotationZ(MathHelper.ToRadians(rotacaoZ)) 
                * Matrix.CreateRotationX(MathHelper.ToRadians(rotacaoX)) 
                * Matrix.CreateTranslation(navePos) 
                * Matrix.CreateFromQuaternion(rodarModelo) 
                * Matrix.CreateTranslation(Posicao);          
        }

        public void Draw(GameTime gameTime, BasicCamera camera, SpriteBatch spriteBatch, GameWindow Window)
        {
            //desenha o modelo
            this.Desenhar(camera);

        }
    }
}
